#!/bin/bash
# -*- coding: utf-8 -*-
# 日志分析器脚本
# 自动解析权限维持系统日志，生成合规审计报告

set -euo pipefail

# 脚本信息
SCRIPT_NAME="log_analyzer.sh"
SCRIPT_VERSION="1.0"
SCRIPT_AUTHOR="PrivilegeMA Team"

# 默认配置
DEFAULT_LOG_DIR="/var/log/privilege_ma"
DEFAULT_OUTPUT_DIR="/tmp/privilege_ma_reports"
DEFAULT_DAYS=7
DEFAULT_FORMAT="html"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
NC='\033[0m' # No Color

# 全局变量
LOG_DIR=""
OUTPUT_DIR=""
DAYS=""
FORMAT=""
VERBOSE=false
QUIET=false
REPORT_TIMESTAMP=""
TEMP_DIR=""

# 统计变量
TOTAL_EVENTS=0
SECURITY_EVENTS=0
SYSTEM_EVENTS=0
AUDIT_EVENTS=0
ERROR_EVENTS=0
WARNING_EVENTS=0

# 显示帮助信息
show_help() {
    cat << EOF
${WHITE}权限维持系统日志分析器 v${SCRIPT_VERSION}${NC}

${CYAN}用法:${NC}
    $0 [选项]

${CYAN}选项:${NC}
    -d, --log-dir DIR       指定日志目录 (默认: ${DEFAULT_LOG_DIR})
    -o, --output-dir DIR    指定输出目录 (默认: ${DEFAULT_OUTPUT_DIR})
    -t, --days DAYS         分析最近N天的日志 (默认: ${DEFAULT_DAYS})
    -f, --format FORMAT     报告格式 [html|json|csv|txt] (默认: ${DEFAULT_FORMAT})
    -v, --verbose           详细输出
    -q, --quiet             静默模式
    -h, --help              显示此帮助信息

${CYAN}示例:${NC}
    # 分析最近7天的日志，生成HTML报告
    $0 -d /var/log/privilege_ma -o /tmp/reports -t 7 -f html

    # 生成JSON格式的审计报告
    $0 --format json --days 30

    # 静默模式分析日志
    $0 --quiet --log-dir /custom/log/path

${CYAN}支持的日志格式:${NC}
    - 标准syslog格式 (RFC 5424)
    - JSON结构化日志
    - 自定义权限维持系统日志格式

${CYAN}生成的报告包含:${NC}
    - 事件统计摘要
    - 安全事件分析
    - 系统操作审计
    - 用户行为分析
    - 风险评估报告
    - 合规性检查结果

EOF
}

# 日志函数
log_info() {
    if [[ "$QUIET" != true ]]; then
        echo -e "${GREEN}[INFO]${NC} $1" >&2
    fi
}

log_warn() {
    if [[ "$QUIET" != true ]]; then
        echo -e "${YELLOW}[WARN]${NC} $1" >&2
    fi
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1" >&2
}

log_debug() {
    if [[ "$VERBOSE" == true ]]; then
        echo -e "${BLUE}[DEBUG]${NC} $1" >&2
    fi
}

# 检查依赖
check_dependencies() {
    local deps=("jq" "awk" "sed" "grep" "sort" "uniq" "wc" "date")
    local missing_deps=()
    
    for dep in "${deps[@]}"; do
        if ! command -v "$dep" &> /dev/null; then
            missing_deps+=("$dep")
        fi
    done
    
    if [[ ${#missing_deps[@]} -gt 0 ]]; then
        log_error "缺少依赖工具: ${missing_deps[*]}"
        log_error "请安装缺少的工具后重试"
        exit 1
    fi
    
    log_debug "依赖检查通过"
}

# 初始化环境
init_environment() {
    # 创建临时目录
    TEMP_DIR=$(mktemp -d)
    trap cleanup EXIT
    
    # 创建输出目录
    mkdir -p "$OUTPUT_DIR"
    
    # 设置报告时间戳
    REPORT_TIMESTAMP=$(date '+%Y%m%d_%H%M%S')
    
    log_debug "临时目录: $TEMP_DIR"
    log_debug "输出目录: $OUTPUT_DIR"
    log_debug "报告时间戳: $REPORT_TIMESTAMP"
}

# 清理函数
cleanup() {
    if [[ -n "$TEMP_DIR" && -d "$TEMP_DIR" ]]; then
        rm -rf "$TEMP_DIR"
        log_debug "清理临时目录: $TEMP_DIR"
    fi
}

# 查找日志文件
find_log_files() {
    local log_files=()
    local cutoff_date
    
    # 计算截止日期
    if command -v date &> /dev/null; then
        if [[ "$OSTYPE" == "darwin"* ]]; then
            # macOS
            cutoff_date=$(date -v-${DAYS}d '+%Y-%m-%d')
        else
            # Linux
            cutoff_date=$(date -d "${DAYS} days ago" '+%Y-%m-%d')
        fi
    else
        log_warn "无法计算日期，将分析所有日志文件"
        cutoff_date=""
    fi
    
    log_debug "截止日期: $cutoff_date"
    
    # 查找日志文件
    if [[ -d "$LOG_DIR" ]]; then
        while IFS= read -r -d '' file; do
            if [[ -n "$cutoff_date" ]]; then
                # 检查文件修改时间
                if [[ "$OSTYPE" == "darwin"* ]]; then
                    file_date=$(stat -f "%Sm" -t "%Y-%m-%d" "$file")
                else
                    file_date=$(stat -c "%y" "$file" | cut -d' ' -f1)
                fi
                
                if [[ "$file_date" >= "$cutoff_date" ]]; then
                    log_files+=("$file")
                fi
            else
                log_files+=("$file")
            fi
        done < <(find "$LOG_DIR" -type f \( -name "*.log" -o -name "privilege_ma*" \) -print0)
    fi
    
    # 检查系统日志
    local syslog_files=("/var/log/syslog" "/var/log/messages" "/var/log/auth.log")
    for syslog_file in "${syslog_files[@]}"; do
        if [[ -f "$syslog_file" && -r "$syslog_file" ]]; then
            log_files+=("$syslog_file")
        fi
    done
    
    if [[ ${#log_files[@]} -eq 0 ]]; then
        log_error "未找到日志文件在目录: $LOG_DIR"
        exit 1
    fi
    
    log_info "找到 ${#log_files[@]} 个日志文件"
    printf '%s\n' "${log_files[@]}" > "$TEMP_DIR/log_files.txt"
}

# 解析日志文件
parse_log_files() {
    local events_file="$TEMP_DIR/events.json"
    local security_file="$TEMP_DIR/security_events.json"
    local system_file="$TEMP_DIR/system_events.json"
    local audit_file="$TEMP_DIR/audit_events.json"
    
    log_info "开始解析日志文件..."
    
    # 初始化输出文件
    echo "[]" > "$events_file"
    echo "[]" > "$security_file"
    echo "[]" > "$system_file"
    echo "[]" > "$audit_file"
    
    while IFS= read -r log_file; do
        log_debug "解析文件: $log_file"
        
        if [[ ! -r "$log_file" ]]; then
            log_warn "无法读取文件: $log_file"
            continue
        fi
        
        # 检测日志格式并解析
        if grep -q "privilege_ma" "$log_file"; then
            parse_privilege_ma_logs "$log_file" "$events_file"
        elif grep -q "CEF:" "$log_file"; then
            parse_cef_logs "$log_file" "$events_file"
        elif grep -q "LEEF:" "$log_file"; then
            parse_leef_logs "$log_file" "$events_file"
        else
            parse_syslog_format "$log_file" "$events_file"
        fi
        
    done < "$TEMP_DIR/log_files.txt"
    
    # 分类事件
    categorize_events "$events_file" "$security_file" "$system_file" "$audit_file"
    
    log_info "日志解析完成"
}

# 解析权限维持系统日志
parse_privilege_ma_logs() {
    local log_file="$1"
    local output_file="$2"
    
    # 提取JSON格式的日志条目
    grep "privilege_ma" "$log_file" | while IFS= read -r line; do
        # 尝试提取JSON部分
        json_part=$(echo "$line" | sed -n 's/.*\({.*}\).*/\1/p')
        
        if [[ -n "$json_part" ]] && echo "$json_part" | jq . &>/dev/null; then
            echo "$json_part" >> "$TEMP_DIR/raw_events.jsonl"
        else
            # 解析非JSON格式
            parse_text_log_line "$line" >> "$TEMP_DIR/raw_events.jsonl"
        fi
    done
    
    # 合并到主事件文件
    if [[ -f "$TEMP_DIR/raw_events.jsonl" ]]; then
        jq -s '.' "$TEMP_DIR/raw_events.jsonl" > "$TEMP_DIR/temp_events.json"
        jq -s 'add' "$output_file" "$TEMP_DIR/temp_events.json" > "$TEMP_DIR/merged_events.json"
        mv "$TEMP_DIR/merged_events.json" "$output_file"
        rm -f "$TEMP_DIR/raw_events.jsonl" "$TEMP_DIR/temp_events.json"
    fi
}

# 解析文本日志行
parse_text_log_line() {
    local line="$1"
    local timestamp level message
    
    # 提取时间戳
    timestamp=$(echo "$line" | awk '{print $1 " " $2 " " $3}')
    
    # 提取日志级别
    if echo "$line" | grep -q "ERROR"; then
        level="ERROR"
    elif echo "$line" | grep -q "WARN"; then
        level="WARNING"
    elif echo "$line" | grep -q "INFO"; then
        level="INFO"
    else
        level="DEBUG"
    fi
    
    # 提取消息
    message=$(echo "$line" | sed 's/^[^:]*: //')
    
    # 生成JSON
    jq -n \
        --arg timestamp "$timestamp" \
        --arg level "$level" \
        --arg message "$message" \
        --arg source "text_log" \
        '{
            timestamp: $timestamp,
            level: $level,
            message: $message,
            source: $source,
            event_type: "general"
        }'
}

# 解析CEF格式日志
parse_cef_logs() {
    local log_file="$1"
    local output_file="$2"
    
    grep "CEF:" "$log_file" | while IFS= read -r line; do
        # CEF格式解析
        local cef_parts
        IFS='|' read -ra cef_parts <<< "$line"
        
        if [[ ${#cef_parts[@]} -ge 7 ]]; then
            jq -n \
                --arg timestamp "$(date -Iseconds)" \
                --arg vendor "${cef_parts[1]}" \
                --arg product "${cef_parts[2]}" \
                --arg version "${cef_parts[3]}" \
                --arg signature "${cef_parts[4]}" \
                --arg name "${cef_parts[5]}" \
                --arg severity "${cef_parts[6]}" \
                --arg extension "${cef_parts[7]:-}" \
                '{
                    timestamp: $timestamp,
                    format: "CEF",
                    vendor: $vendor,
                    product: $product,
                    version: $version,
                    signature: $signature,
                    name: $name,
                    severity: $severity,
                    extension: $extension,
                    event_type: "security"
                }' >> "$TEMP_DIR/cef_events.jsonl"
        fi
    done
    
    # 合并CEF事件
    if [[ -f "$TEMP_DIR/cef_events.jsonl" ]]; then
        jq -s '.' "$TEMP_DIR/cef_events.jsonl" > "$TEMP_DIR/cef_events.json"
        jq -s 'add' "$output_file" "$TEMP_DIR/cef_events.json" > "$TEMP_DIR/merged_events.json"
        mv "$TEMP_DIR/merged_events.json" "$output_file"
        rm -f "$TEMP_DIR/cef_events.jsonl" "$TEMP_DIR/cef_events.json"
    fi
}

# 解析LEEF格式日志
parse_leef_logs() {
    local log_file="$1"
    local output_file="$2"
    
    grep "LEEF:" "$log_file" | while IFS= read -r line; do
        # LEEF格式解析
        local leef_parts
        IFS='|' read -ra leef_parts <<< "$line"
        
        if [[ ${#leef_parts[@]} -ge 6 ]]; then
            jq -n \
                --arg timestamp "$(date -Iseconds)" \
                --arg version "${leef_parts[0]}" \
                --arg vendor "${leef_parts[1]}" \
                --arg product "${leef_parts[2]}" \
                --arg product_version "${leef_parts[3]}" \
                --arg event_id "${leef_parts[4]}" \
                --arg attributes "${leef_parts[5]:-}" \
                '{
                    timestamp: $timestamp,
                    format: "LEEF",
                    version: $version,
                    vendor: $vendor,
                    product: $product,
                    product_version: $product_version,
                    event_id: $event_id,
                    attributes: $attributes,
                    event_type: "security"
                }' >> "$TEMP_DIR/leef_events.jsonl"
        fi
    done
    
    # 合并LEEF事件
    if [[ -f "$TEMP_DIR/leef_events.jsonl" ]]; then
        jq -s '.' "$TEMP_DIR/leef_events.jsonl" > "$TEMP_DIR/leef_events.json"
        jq -s 'add' "$output_file" "$TEMP_DIR/leef_events.json" > "$TEMP_DIR/merged_events.json"
        mv "$TEMP_DIR/merged_events.json" "$output_file"
        rm -f "$TEMP_DIR/leef_events.jsonl" "$TEMP_DIR/leef_events.json"
    fi
}

# 解析标准syslog格式
parse_syslog_format() {
    local log_file="$1"
    local output_file="$2"
    
    # 查找包含privilege_ma相关的syslog条目
    grep -i "privilege_ma\|privilege-ma" "$log_file" | while IFS= read -r line; do
        # 解析syslog格式
        local timestamp hostname process message
        
        # 提取时间戳 (假设标准syslog格式)
        timestamp=$(echo "$line" | awk '{print $1 " " $2 " " $3}')
        hostname=$(echo "$line" | awk '{print $4}')
        process=$(echo "$line" | awk '{print $5}' | sed 's/\[.*\]://')
        message=$(echo "$line" | cut -d' ' -f6-)
        
        jq -n \
            --arg timestamp "$timestamp" \
            --arg hostname "$hostname" \
            --arg process "$process" \
            --arg message "$message" \
            '{
                timestamp: $timestamp,
                hostname: $hostname,
                process: $process,
                message: $message,
                source: "syslog",
                event_type: "system"
            }' >> "$TEMP_DIR/syslog_events.jsonl"
    done
    
    # 合并syslog事件
    if [[ -f "$TEMP_DIR/syslog_events.jsonl" ]]; then
        jq -s '.' "$TEMP_DIR/syslog_events.jsonl" > "$TEMP_DIR/syslog_events.json"
        jq -s 'add' "$output_file" "$TEMP_DIR/syslog_events.json" > "$TEMP_DIR/merged_events.json"
        mv "$TEMP_DIR/merged_events.json" "$output_file"
        rm -f "$TEMP_DIR/syslog_events.jsonl" "$TEMP_DIR/syslog_events.json"
    fi
}

# 分类事件
categorize_events() {
    local events_file="$1"
    local security_file="$2"
    local system_file="$3"
    local audit_file="$4"
    
    log_info "分类事件..."
    
    # 统计总事件数
    TOTAL_EVENTS=$(jq 'length' "$events_file")
    
    # 分类安全事件
    jq '[.[] | select(.event_type == "security" or .category == "security" or (.message | test("security|attack|threat|malware|intrusion"; "i")))]' "$events_file" > "$security_file"
    SECURITY_EVENTS=$(jq 'length' "$security_file")
    
    # 分类系统事件
    jq '[.[] | select(.event_type == "system" or .category == "system" or (.message | test("system|startup|shutdown|service"; "i")))]' "$events_file" > "$system_file"
    SYSTEM_EVENTS=$(jq 'length' "$system_file")
    
    # 分类审计事件
    jq '[.[] | select(.event_type == "audit" or .category == "audit" or (.message | test("audit|access|login|logout|permission"; "i")))]' "$events_file" > "$audit_file"
    AUDIT_EVENTS=$(jq 'length' "$audit_file")
    
    # 统计错误和警告
    ERROR_EVENTS=$(jq '[.[] | select(.level == "ERROR" or .level == "CRITICAL" or .level == "EMERGENCY")]' "$events_file" | jq 'length')
    WARNING_EVENTS=$(jq '[.[] | select(.level == "WARNING" or .level == "WARN")]' "$events_file" | jq 'length')
    
    log_debug "事件分类完成 - 总计: $TOTAL_EVENTS, 安全: $SECURITY_EVENTS, 系统: $SYSTEM_EVENTS, 审计: $AUDIT_EVENTS"
}

# 生成统计报告
generate_statistics() {
    local stats_file="$TEMP_DIR/statistics.json"
    
    log_info "生成统计信息..."
    
    # 计算时间范围
    local start_date end_date
    start_date=$(date -d "${DAYS} days ago" '+%Y-%m-%d' 2>/dev/null || date -v-${DAYS}d '+%Y-%m-%d' 2>/dev/null || echo "Unknown")
    end_date=$(date '+%Y-%m-%d')
    
    # 生成统计JSON
    jq -n \
        --arg report_timestamp "$REPORT_TIMESTAMP" \
        --arg start_date "$start_date" \
        --arg end_date "$end_date" \
        --argjson days "$DAYS" \
        --argjson total_events "$TOTAL_EVENTS" \
        --argjson security_events "$SECURITY_EVENTS" \
        --argjson system_events "$SYSTEM_EVENTS" \
        --argjson audit_events "$AUDIT_EVENTS" \
        --argjson error_events "$ERROR_EVENTS" \
        --argjson warning_events "$WARNING_EVENTS" \
        '{
            report_info: {
                timestamp: $report_timestamp,
                start_date: $start_date,
                end_date: $end_date,
                analysis_period_days: $days,
                generator: "privilege_ma_log_analyzer",
                version: "1.0"
            },
            event_summary: {
                total_events: $total_events,
                security_events: $security_events,
                system_events: $system_events,
                audit_events: $audit_events,
                error_events: $error_events,
                warning_events: $warning_events
            },
            event_distribution: {
                security_percentage: (if $total_events > 0 then ($security_events * 100 / $total_events) else 0 end),
                system_percentage: (if $total_events > 0 then ($system_events * 100 / $total_events) else 0 end),
                audit_percentage: (if $total_events > 0 then ($audit_events * 100 / $total_events) else 0 end),
                error_percentage: (if $total_events > 0 then ($error_events * 100 / $total_events) else 0 end)
            }
        }' > "$stats_file"
    
    log_debug "统计信息已生成: $stats_file"
}

# 生成HTML报告
generate_html_report() {
    local output_file="$OUTPUT_DIR/privilege_ma_audit_report_${REPORT_TIMESTAMP}.html"
    local stats_file="$TEMP_DIR/statistics.json"
    
    log_info "生成HTML报告..."
    
    cat > "$output_file" << 'EOF'
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>权限维持系统审计报告</title>
    <style>
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            margin: 0;
            padding: 20px;
            background-color: #f5f5f5;
            color: #333;
        }
        .container {
            max-width: 1200px;
            margin: 0 auto;
            background: white;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
            overflow: hidden;
        }
        .header {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            padding: 30px;
            text-align: center;
        }
        .header h1 {
            margin: 0;
            font-size: 2.5em;
            font-weight: 300;
        }
        .header p {
            margin: 10px 0 0 0;
            opacity: 0.9;
        }
        .content {
            padding: 30px;
        }
        .section {
            margin-bottom: 40px;
        }
        .section h2 {
            color: #667eea;
            border-bottom: 2px solid #667eea;
            padding-bottom: 10px;
            margin-bottom: 20px;
        }
        .stats-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
            gap: 20px;
            margin-bottom: 30px;
        }
        .stat-card {
            background: #f8f9fa;
            border-left: 4px solid #667eea;
            padding: 20px;
            border-radius: 4px;
        }
        .stat-card h3 {
            margin: 0 0 10px 0;
            color: #667eea;
            font-size: 1.1em;
        }
        .stat-card .number {
            font-size: 2em;
            font-weight: bold;
            color: #333;
        }
        .stat-card .percentage {
            color: #666;
            font-size: 0.9em;
        }
        .alert {
            padding: 15px;
            border-radius: 4px;
            margin-bottom: 20px;
        }
        .alert-info {
            background-color: #d1ecf1;
            border-color: #bee5eb;
            color: #0c5460;
        }
        .alert-warning {
            background-color: #fff3cd;
            border-color: #ffeaa7;
            color: #856404;
        }
        .alert-danger {
            background-color: #f8d7da;
            border-color: #f5c6cb;
            color: #721c24;
        }
        .table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 20px;
        }
        .table th,
        .table td {
            padding: 12px;
            text-align: left;
            border-bottom: 1px solid #ddd;
        }
        .table th {
            background-color: #f8f9fa;
            font-weight: 600;
            color: #667eea;
        }
        .table tr:hover {
            background-color: #f5f5f5;
        }
        .footer {
            background-color: #f8f9fa;
            padding: 20px;
            text-align: center;
            color: #666;
            border-top: 1px solid #ddd;
        }
        .progress-bar {
            background-color: #e9ecef;
            border-radius: 4px;
            overflow: hidden;
            height: 20px;
            margin-top: 10px;
        }
        .progress-fill {
            height: 100%;
            background: linear-gradient(90deg, #667eea, #764ba2);
            transition: width 0.3s ease;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h1>权限维持系统审计报告</h1>
            <p>生成时间: REPORT_TIMESTAMP_PLACEHOLDER</p>
        </div>
        
        <div class="content">
            <!-- 报告摘要 -->
            <div class="section">
                <h2>📊 报告摘要</h2>
                <div class="stats-grid">
                    <div class="stat-card">
                        <h3>总事件数</h3>
                        <div class="number">TOTAL_EVENTS_PLACEHOLDER</div>
                    </div>
                    <div class="stat-card">
                        <h3>安全事件</h3>
                        <div class="number">SECURITY_EVENTS_PLACEHOLDER</div>
                        <div class="percentage">SECURITY_PERCENTAGE_PLACEHOLDER%</div>
                    </div>
                    <div class="stat-card">
                        <h3>系统事件</h3>
                        <div class="number">SYSTEM_EVENTS_PLACEHOLDER</div>
                        <div class="percentage">SYSTEM_PERCENTAGE_PLACEHOLDER%</div>
                    </div>
                    <div class="stat-card">
                        <h3>审计事件</h3>
                        <div class="number">AUDIT_EVENTS_PLACEHOLDER</div>
                        <div class="percentage">AUDIT_PERCENTAGE_PLACEHOLDER%</div>
                    </div>
                    <div class="stat-card">
                        <h3>错误事件</h3>
                        <div class="number">ERROR_EVENTS_PLACEHOLDER</div>
                        <div class="percentage">ERROR_PERCENTAGE_PLACEHOLDER%</div>
                    </div>
                    <div class="stat-card">
                        <h3>警告事件</h3>
                        <div class="number">WARNING_EVENTS_PLACEHOLDER</div>
                        <div class="percentage">WARNING_PERCENTAGE_PLACEHOLDER%</div>
                    </div>
                </div>
            </div>
            
            <!-- 风险评估 -->
            <div class="section">
                <h2>⚠️ 风险评估</h2>
                <div class="alert alert-info">
                    <strong>分析周期:</strong> START_DATE_PLACEHOLDER 至 END_DATE_PLACEHOLDER (DAYS_PLACEHOLDER 天)
                </div>
                
                RISK_ALERTS_PLACEHOLDER
            </div>
            
            <!-- 合规性检查 -->
            <div class="section">
                <h2>✅ 合规性检查</h2>
                <div class="alert alert-info">
                    <strong>检查标准:</strong> 基于企业安全策略和行业最佳实践
                </div>
                
                COMPLIANCE_RESULTS_PLACEHOLDER
            </div>
            
            <!-- 建议措施 -->
            <div class="section">
                <h2>💡 建议措施</h2>
                RECOMMENDATIONS_PLACEHOLDER
            </div>
        </div>
        
        <div class="footer">
            <p>此报告由权限维持系统日志分析器自动生成 | 版本 1.0</p>
            <p>如有疑问，请联系安全团队</p>
        </div>
    </div>
</body>
</html>
EOF

    # 替换占位符
    local stats_data
    stats_data=$(cat "$stats_file")
    
    # 提取统计数据
    local report_timestamp start_date end_date days
    local total_events security_events system_events audit_events error_events warning_events
    local security_percentage system_percentage audit_percentage error_percentage warning_percentage
    
    report_timestamp=$(echo "$stats_data" | jq -r '.report_info.timestamp')
    start_date=$(echo "$stats_data" | jq -r '.report_info.start_date')
    end_date=$(echo "$stats_data" | jq -r '.report_info.end_date')
    days=$(echo "$stats_data" | jq -r '.report_info.analysis_period_days')
    
    total_events=$(echo "$stats_data" | jq -r '.event_summary.total_events')
    security_events=$(echo "$stats_data" | jq -r '.event_summary.security_events')
    system_events=$(echo "$stats_data" | jq -r '.event_summary.system_events')
    audit_events=$(echo "$stats_data" | jq -r '.event_summary.audit_events')
    error_events=$(echo "$stats_data" | jq -r '.event_summary.error_events')
    warning_events=$(echo "$stats_data" | jq -r '.event_summary.warning_events')
    
    security_percentage=$(echo "$stats_data" | jq -r '.event_distribution.security_percentage' | xargs printf "%.1f")
    system_percentage=$(echo "$stats_data" | jq -r '.event_distribution.system_percentage' | xargs printf "%.1f")
    audit_percentage=$(echo "$stats_data" | jq -r '.event_distribution.audit_percentage' | xargs printf "%.1f")
    error_percentage=$(echo "$stats_data" | jq -r '.event_distribution.error_percentage' | xargs printf "%.1f")
    warning_percentage=$(echo "$stats_data" | jq -r '.event_distribution.warning_percentage' | xargs printf "%.1f")
    
    # 替换占位符
    sed -i.bak \
        -e "s/REPORT_TIMESTAMP_PLACEHOLDER/$report_timestamp/g" \
        -e "s/START_DATE_PLACEHOLDER/$start_date/g" \
        -e "s/END_DATE_PLACEHOLDER/$end_date/g" \
        -e "s/DAYS_PLACEHOLDER/$days/g" \
        -e "s/TOTAL_EVENTS_PLACEHOLDER/$total_events/g" \
        -e "s/SECURITY_EVENTS_PLACEHOLDER/$security_events/g" \
        -e "s/SYSTEM_EVENTS_PLACEHOLDER/$system_events/g" \
        -e "s/AUDIT_EVENTS_PLACEHOLDER/$audit_events/g" \
        -e "s/ERROR_EVENTS_PLACEHOLDER/$error_events/g" \
        -e "s/WARNING_EVENTS_PLACEHOLDER/$warning_events/g" \
        -e "s/SECURITY_PERCENTAGE_PLACEHOLDER/$security_percentage/g" \
        -e "s/SYSTEM_PERCENTAGE_PLACEHOLDER/$system_percentage/g" \
        -e "s/AUDIT_PERCENTAGE_PLACEHOLDER/$audit_percentage/g" \
        -e "s/ERROR_PERCENTAGE_PLACEHOLDER/$error_percentage/g" \
        -e "s/WARNING_PERCENTAGE_PLACEHOLDER/$warning_percentage/g" \
        "$output_file"
    
    # 生成风险警报
    local risk_alerts=""
    if [[ $error_events -gt 0 ]]; then
        risk_alerts+='<div class="alert alert-danger"><strong>高风险:</strong> 检测到 '$error_events' 个错误事件，需要立即关注</div>'
    fi
    if [[ $warning_events -gt 10 ]]; then
        risk_alerts+='<div class="alert alert-warning"><strong>中风险:</strong> 检测到 '$warning_events' 个警告事件，建议进一步调查</div>'
    fi
    if [[ -z "$risk_alerts" ]]; then
        risk_alerts='<div class="alert alert-info"><strong>低风险:</strong> 未检测到明显的安全风险</div>'
    fi
    
    # 生成合规性结果
    local compliance_results='<div class="alert alert-info"><strong>合规状态:</strong> 系统运行正常，符合基本安全要求</div>'
    
    # 生成建议措施
    local recommendations='<ul><li>定期监控系统日志，及时发现异常活动</li><li>保持系统和安全工具的最新版本</li><li>建立完善的事件响应流程</li><li>定期进行安全审计和风险评估</li></ul>'
    
    # 替换动态内容
    sed -i.bak2 \
        -e "s|RISK_ALERTS_PLACEHOLDER|$risk_alerts|g" \
        -e "s|COMPLIANCE_RESULTS_PLACEHOLDER|$compliance_results|g" \
        -e "s|RECOMMENDATIONS_PLACEHOLDER|$recommendations|g" \
        "$output_file"
    
    # 清理备份文件
    rm -f "$output_file.bak" "$output_file.bak2"
    
    log_info "HTML报告已生成: $output_file"
}

# 生成JSON报告
generate_json_report() {
    local output_file="$OUTPUT_DIR/privilege_ma_audit_report_${REPORT_TIMESTAMP}.json"
    local stats_file="$TEMP_DIR/statistics.json"
    local events_file="$TEMP_DIR/events.json"
    
    log_info "生成JSON报告..."
    
    # 合并统计信息和事件数据
    jq -s '{
        statistics: .[0],
        events: .[1],
        metadata: {
            generator: "privilege_ma_log_analyzer",
            version: "1.0",
            format: "json"
        }
    }' "$stats_file" "$events_file" > "$output_file"
    
    log_info "JSON报告已生成: $output_file"
}

# 生成CSV报告
generate_csv_report() {
    local output_file="$OUTPUT_DIR/privilege_ma_audit_report_${REPORT_TIMESTAMP}.csv"
    local events_file="$TEMP_DIR/events.json"
    
    log_info "生成CSV报告..."
    
    # 生成CSV头部
    echo "Timestamp,Level,Event Type,Message,Source,Hostname" > "$output_file"
    
    # 转换JSON到CSV
    jq -r '.[] | [
        .timestamp // "",
        .level // "",
        .event_type // "",
        (.message // "" | gsub(","; ";")),
        .source // "",
        .hostname // ""
    ] | @csv' "$events_file" >> "$output_file"
    
    log_info "CSV报告已生成: $output_file"
}

# 生成文本报告
generate_text_report() {
    local output_file="$OUTPUT_DIR/privilege_ma_audit_report_${REPORT_TIMESTAMP}.txt"
    local stats_file="$TEMP_DIR/statistics.json"
    
    log_info "生成文本报告..."
    
    cat > "$output_file" << EOF
权限维持系统审计报告
====================

生成时间: $(date)
分析器版本: 1.0

报告摘要
--------
总事件数: $TOTAL_EVENTS
安全事件: $SECURITY_EVENTS
系统事件: $SYSTEM_EVENTS
审计事件: $AUDIT_EVENTS
错误事件: $ERROR_EVENTS
警告事件: $WARNING_EVENTS

分析周期: $DAYS 天

风险评估
--------
EOF

    if [[ $ERROR_EVENTS -gt 0 ]]; then
        echo "⚠️  高风险: 检测到 $ERROR_EVENTS 个错误事件" >> "$output_file"
    fi
    
    if [[ $WARNING_EVENTS -gt 10 ]]; then
        echo "⚠️  中风险: 检测到 $WARNING_EVENTS 个警告事件" >> "$output_file"
    fi
    
    if [[ $ERROR_EVENTS -eq 0 && $WARNING_EVENTS -le 10 ]]; then
        echo "✅ 低风险: 未检测到明显的安全风险" >> "$output_file"
    fi
    
    cat >> "$output_file" << EOF

建议措施
--------
1. 定期监控系统日志，及时发现异常活动
2. 保持系统和安全工具的最新版本
3. 建立完善的事件响应流程
4. 定期进行安全审计和风险评估

详细统计信息
------------
EOF

    # 添加详细统计
    jq -r '
        "报告信息:",
        "  时间戳: " + .report_info.timestamp,
        "  开始日期: " + .report_info.start_date,
        "  结束日期: " + .report_info.end_date,
        "  分析周期: " + (.report_info.analysis_period_days | tostring) + " 天",
        "",
        "事件分布:",
        "  安全事件占比: " + (.event_distribution.security_percentage | tostring) + "%",
        "  系统事件占比: " + (.event_distribution.system_percentage | tostring) + "%",
        "  审计事件占比: " + (.event_distribution.audit_percentage | tostring) + "%",
        "  错误事件占比: " + (.event_distribution.error_percentage | tostring) + "%"
    ' "$stats_file" >> "$output_file"
    
    log_info "文本报告已生成: $output_file"
}

# 主函数
main() {
    # 解析命令行参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            -d|--log-dir)
                LOG_DIR="$2"
                shift 2
                ;;
            -o|--output-dir)
                OUTPUT_DIR="$2"
                shift 2
                ;;
            -t|--days)
                DAYS="$2"
                shift 2
                ;;
            -f|--format)
                FORMAT="$2"
                shift 2
                ;;
            -v|--verbose)
                VERBOSE=true
                shift
                ;;
            -q|--quiet)
                QUIET=true
                shift
                ;;
            -h|--help)
                show_help
                exit 0
                ;;
            *)
                log_error "未知选项: $1"
                show_help
                exit 1
                ;;
        esac
    done
    
    # 设置默认值
    LOG_DIR="${LOG_DIR:-$DEFAULT_LOG_DIR}"
    OUTPUT_DIR="${OUTPUT_DIR:-$DEFAULT_OUTPUT_DIR}"
    DAYS="${DAYS:-$DEFAULT_DAYS}"
    FORMAT="${FORMAT:-$DEFAULT_FORMAT}"
    
    # 验证参数
    if [[ ! -d "$LOG_DIR" ]]; then
        log_error "日志目录不存在: $LOG_DIR"
        exit 1
    fi
    
    if [[ ! "$DAYS" =~ ^[0-9]+$ ]] || [[ "$DAYS" -le 0 ]]; then
        log_error "无效的天数: $DAYS"
        exit 1
    fi
    
    if [[ ! "$FORMAT" =~ ^(html|json|csv|txt)$ ]]; then
        log_error "不支持的格式: $FORMAT"
        exit 1
    fi
    
    # 显示配置
    if [[ "$QUIET" != true ]]; then
        echo -e "${WHITE}权限维持系统日志分析器 v${SCRIPT_VERSION}${NC}"
        echo -e "${CYAN}配置信息:${NC}"
        echo -e "  日志目录: ${YELLOW}$LOG_DIR${NC}"
        echo -e "  输出目录: ${YELLOW}$OUTPUT_DIR${NC}"
        echo -e "  分析天数: ${YELLOW}$DAYS${NC}"
        echo -e "  报告格式: ${YELLOW}$FORMAT${NC}"
        echo ""
    fi
    
    # 检查依赖
    check_dependencies
    
    # 初始化环境
    init_environment
    
    # 查找日志文件
    find_log_files
    
    # 解析日志文件
    parse_log_files
    
    # 生成统计信息
    generate_statistics
    
    # 生成报告
    case "$FORMAT" in
        html)
            generate_html_report
            ;;
        json)
            generate_json_report
            ;;
        csv)
            generate_csv_report
            ;;
        txt)
            generate_text_report
            ;;
    esac
    
    # 显示完成信息
    if [[ "$QUIET" != true ]]; then
        echo ""
        echo -e "${GREEN}✅ 日志分析完成${NC}"
        echo -e "${CYAN}统计摘要:${NC}"
        echo -e "  总事件数: ${YELLOW}$TOTAL_EVENTS${NC}"
        echo -e "  安全事件: ${YELLOW}$SECURITY_EVENTS${NC}"
        echo -e "  系统事件: ${YELLOW}$SYSTEM_EVENTS${NC}"
        echo -e "  审计事件: ${YELLOW}$AUDIT_EVENTS${NC}"
        echo -e "  错误事件: ${RED}$ERROR_EVENTS${NC}"
        echo -e "  警告事件: ${YELLOW}$WARNING_EVENTS${NC}"
        echo ""
        echo -e "${CYAN}报告文件已保存到: ${YELLOW}$OUTPUT_DIR${NC}"
    fi
}

# 运行主函数
main "$@"